# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-11-28
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
# from dataclasses import dataclass

from 神笔码靓.神笔库 import 范围, 计算旋转后的坐标
from 神笔码靓.神笔库.元素库 import 可操作元素集合
from 神笔码靓.神笔库.定义集 import *


# @dataclass
# class 动画关键帧:
#     时间点: [float, int] = 0
#
#
# @dataclass
# class 缩放动画关键帧(动画关键帧):
#     缩放X: [float, int] = 1
#     缩放Y: [float, int] = 1
#
#
# @dataclass
# class 平移动画关键帧(动画关键帧):
#     位置X: [float, int] = 0
#     位置Y: [float, int] = 0
#
#
# @dataclass
# class 倾斜动画关键帧(动画关键帧):
#     倾斜角: [float, int] = 10
#
#
# @dataclass
# class 旋转动画关键帧(动画关键帧):
#     旋转角: [float, int] = 0
#     旋转中心点: tuple[[float, int], [float, int]] = (0, 0)


class 元素排列工具集:
    def __init__(self, 高清图=None):
        from 神笔码靓.神笔库 import 神笔绘图板
        self.绘图板: 神笔绘图板 = 高清图
        self.dwg = 高清图.dwg

    def 水平排列(self, 元素集合, 元素间距: float) -> 可操作元素集合:
        元素列表 = 可操作元素集合(self.绘图板)
        for i, 元素_ in enumerate(元素集合):
            元素_.平移(i * 元素间距, 0)
            元素列表.添加元素(元素_)
        return 元素列表

    def 垂直排列(self, 元素集合, 元素间距: float) -> 可操作元素集合:
        元素列表 = 可操作元素集合(self.绘图板)
        for i, 元素_ in enumerate(元素集合):
            元素_.平移(0, i * 元素间距)
            元素列表.添加元素(元素_)
        return 元素列表

    def 网格水平排列(self, 元素集合, 最大列数, 列间距: float, 行间距: float) -> 可操作元素集合:
        元素列表 = 可操作元素集合(self.绘图板)
        集合数量 = len(元素集合)
        列号 = 0
        行号 = 0
        for i in 范围(集合数量):
            元素_ = 元素集合[i]
            元素_.平移(列号 * 列间距, 行号 * 行间距)
            列号 += 1
            if 列号 >= 最大列数:
                列号 = 0
                行号 += 1
            元素列表.添加元素(元素_)

        return 元素列表

    def 网格垂直排列(self, 元素集合, 最大行数, 行间距: float, 列间距: float) -> 可操作元素集合:
        元素列表 = 可操作元素集合(self.绘图板)
        集合数量 = len(元素集合)
        列号 = 0
        行号 = 0
        for i in 范围(集合数量):
            元素_ = 元素集合[i]
            元素_.平移(列号 * 列间距, 行号 * 行间距)
            行号 += 1
            if 行号 >= 最大行数:
                行号 = 0
                列号 += 1
            元素列表.添加元素(元素_)
        return 元素列表

    def 环绕排列(self, 元素集合, 环绕中心点: tuple[float, float] = None, 间距角: float = None,
             顺时针: bool = 是, 元素跟随旋转: bool = 是) -> 可操作元素集合:
        if 环绕中心点 is None:
            环绕中心点 = self.绘图板.宽 / 2, self.绘图板.高 / 2
        集合数量 = len(元素集合)
        if 间距角 is None:
            间距角 = 360 / 集合数量

        # if callable(元素集合):
        #     创造元素 = 元素集合
        # else:
        #     if not isinstance(元素集合, list):
        #         元素集合 = [元素集合]
        #     重复模板 = self.绘图板.创建模板(元素列表=元素集合)
        #     创造元素 = lambda 参数: 重复模板.创造元素()

        元素列表 = 可操作元素集合(self.绘图板)

        if 元素跟随旋转:
            for i in 范围(集合数量):
                旋转角 = i * 间距角
                if not 顺时针:
                    旋转角 = -旋转角
                参数 = {"索引": i, "间距角": 间距角, "旋转角": 旋转角, "环绕中心点": 环绕中心点}
                # if callable(元素创造前回调):
                #     参数_ = 元素创造前回调(参数)
                #     if 参数_ is not None:
                #         参数 = 参数_
                元素_ = 元素集合[i].旋转(参数["旋转角"], 环绕中心点)
                # if callable(元素创造后回调):
                #     元素创造后回调(元素, 参数)
                元素列表.添加元素(元素_)
        else:
            for i in 范围(集合数量):
                旋转角 = i * 间距角
                if not 顺时针:
                    旋转角 = -旋转角
                参数 = {"索引": i, "间距角": 间距角, "旋转角": 旋转角, "环绕中心点": 环绕中心点}
                # if callable(元素创造前回调):
                #     参数_ = 元素创造前回调(参数)
                #     if 参数_ is not None:
                #         参数 = 参数_
                元素_ = 元素集合[i]
                # if callable(元素创造后回调):
                #     元素创造后回调(元素, 参数)
                元素列表.添加元素(元素_)
                if 旋转角 == 0:
                    continue
                位置信息 = 元素_.获取位置信息()
                元素中心 = 位置信息.中心x, 位置信息.中心y
                元素新x, 元素新y = 计算旋转后的坐标(元素中心, 环绕中心点, 旋转角)
                元素_.平移(元素新x - 位置信息.中心x, 元素新y - 位置信息.中心y)

        return 元素列表


def 测试():
    from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板

    神笔 = 神笔绘图板("元素排列工具集.svg")
    神笔.显示图框()

    # 圆 = 神笔.画圆(x=200, y=200, 半径=50, 填充颜色=颜色.蓝色)
    #
    # 方 = 神笔.画矩形(x=200, y=200, 宽=60, 高=40, 填充颜色=颜色.红色).平移(100, 100)
    # 参考方 = 神笔.画矩形(x=180, y=180, 宽=100, 高=80, 填充颜色=颜色.蓝色).平移(100, 100)

    def 创建爱心(数量: int):
        爱心集合 = []
        for i in range(数量):
            神笔.画爱心(x=100, y=200, 半径大小=20, 填充颜色=颜色.随机色()).添加到列表(爱心集合)
        return 爱心集合

    神笔.环绕排列(元素集合=创建爱心(12), 间距角=30, 环绕中心点=(500, 500), 顺时针=否, 元素跟随旋转=是).旋转(90)
    神笔.垂直排列(元素集合=创建爱心(5), 元素间距=60).平移(0, 200)
    神笔.水平排列(元素集合=创建爱心(5), 元素间距=70)
    神笔.网格水平排列(元素集合=创建爱心(30), 最大列数=9, 列间距=80, 行间距=80).旋转(10)
    神笔.网格垂直排列(元素集合=创建爱心(30), 最大行数=8, 行间距=80, 列间距=80).旋转(40)

    神笔.完成()


if __name__ == '__main__':
    测试()
